package cache

import (
	"gitee.com/gousing/cache/storage"
	"gitee.com/gousing/values"
)

// GetMapAny 获取 map[K]any 类型的缓存值, 如果不存在或已经过期则返回空值
//   - 支持转换目标为任意类型的 map[TypeBase]any
//   - TypeBase: string | bool | int | int8 | int16 | int32 | int64 |	uint | uint8 | uint16 | uint32 | uint64 |	float32 | float64 |	time.Time | time.Duration| time.Month | time.Weekday
func GetMapAny[K values.TypeBase](key string) map[K]any {
	val, _ := GetMapAnyE[K](key)
	return val
}

// GetMapAnyD 获取 map[K]any 类型的缓存值, 如果不存在或已经过期则返回默认值
//   - 支持转换目标为任意类型的 map[TypeBase]any
//   - TypeBase: string | bool | int | int8 | int16 | int32 | int64 |	uint | uint8 | uint16 | uint32 | uint64 |	float32 | float64 |	time.Time | time.Duration| time.Month | time.Weekday
func GetMapAnyD[K values.TypeBase](key string, defaultVal map[K]any) map[K]any {
	if key == "" {
		return defaultVal
	}
	val, err := GetMapAnyE[K](key)
	if err != nil {
		return defaultVal
	}
	return val
}

// GetMapAnyE 获取 map[K]any 类型的缓存值, 如果不存在或已经过期则返回空值 map[K]any 切片和错误信息
//   - 支持转换目标为任意类型的 map[TypeBase]any
//   - TypeBase: string | bool | int | int8 | int16 | int32 | int64 |	uint | uint8 | uint16 | uint32 | uint64 |	float32 | float64 |	time.Time | time.Duration| time.Month | time.Weekday
func GetMapAnyE[K values.TypeBase](key string) (map[K]any, error) {
	val := map[K]any{}
	if key == "" {
		return val, storage.ErrKeyIsEmpty
	}
	err := GetDefault().Scan(key, &val)
	if err == nil {
		return val, nil
	}
	// Key 不存在或已经过期
	if err == storage.ErrKeyNotExists {
		return val, err
	}
	// Key 存在, 直接解码失败, 尝试类型转换
	anyMap := map[any]any{}
	err = GetDefault().Scan(key, &anyMap)
	if err != nil {
		return val, err
	}
	return values.ToMapAnyE[K](anyMap)
}

// GetMapAny 获取 map[K]V 类型的缓存值, 如果不存在或已经过期则返回空值
//   - 支持转换目标为任意类型的 map[TypeBase]TypeBase
//   - TypeBase: string | bool | int | int8 | int16 | int32 | int64 |	uint | uint8 | uint16 | uint32 | uint64 |	float32 | float64 |	time.Time | time.Duration| time.Month | time.Weekday
func GetMapAs[K, V values.TypeBase](key string) map[K]V {
	val, _ := GetMapAsE[K, V](key)
	return val
}

// GetMapAsD 获取 map[K]V 类型的缓存值, 如果不存在或已经过期则返回默认值
//   - 支持转换目标为任意类型的 map[TypeBase]TypeBase
//   - TypeBase: string | bool | int | int8 | int16 | int32 | int64 |	uint | uint8 | uint16 | uint32 | uint64 |	float32 | float64 |	time.Time | time.Duration| time.Month | time.Weekday
func GetMapAsD[K, V values.TypeBase](key string, defaultVal map[K]V) map[K]V {
	if key == "" {
		return defaultVal
	}
	val, err := GetMapAsE[K, V](key)
	if err != nil {
		return defaultVal
	}
	return val
}

// GetMapAsE 获取 map[K]V 类型的缓存值, 如果不存在或已经过期则返回空值 map[K]V 和错误信息
//   - 支持转换目标为任意类型的 map[TypeBase]TypeBase
//   - TypeBase: string | bool | int | int8 | int16 | int32 | int64 |	uint | uint8 | uint16 | uint32 | uint64 |	float32 | float64 |	time.Time | time.Duration| time.Month | time.Weekday
func GetMapAsE[K, V values.TypeBase](key string) (map[K]V, error) {
	val := map[K]V{}
	if key == "" {
		return val, storage.ErrKeyIsEmpty
	}
	err := GetDefault().Scan(key, &val)
	if err == nil {
		return val, nil
	}
	// Key 不存在或已经过期
	if err == storage.ErrKeyNotExists {
		return val, err
	}
	// Key 存在, 直接解码失败, 尝试类型转换
	anyMap := map[any]any{}
	err = GetDefault().Scan(key, &anyMap)
	if err != nil {
		return val, err
	}
	return values.ToMapAsE[K, V](anyMap)
}

// GetMapSlice 获取 map[K][]V 类型的缓存值, 如果不存在或已经过期则返回空值
//   - 支持转换目标为任意类型的 map[TypeBase][]TypeBase
//   - TypeBase: string | bool | int | int8 | int16 | int32 | int64 |	uint | uint8 | uint16 | uint32 | uint64 |	float32 | float64 |	time.Time | time.Duration| time.Month | time.Weekday
func GetMapSlice[K, V values.TypeBase](key string) map[K][]V {
	val, _ := GetMapSliceE[K, V](key)
	return val
}

// GetMapSliceD 获取 map[K][]V 类型的缓存值, 如果不存在或已经过期则返回默认值
//   - 支持转换目标为任意类型的 map[TypeBase][]TypeBase
//   - TypeBase: string | bool | int | int8 | int16 | int32 | int64 |	uint | uint8 | uint16 | uint32 | uint64 |	float32 | float64 |	time.Time | time.Duration| time.Month | time.Weekday
func GetMapSliceD[K, V values.TypeBase](key string, defaultVal map[K][]V) map[K][]V {
	if key == "" {
		return defaultVal
	}
	val, err := GetMapSliceE[K, V](key)
	if err != nil {
		return defaultVal
	}
	return val
}

// GetMapSliceE 获取 map[K][]V 类型的缓存值, 如果不存在或已经过期则返回空值 map[K][]V 和错误信息
//   - 支持转换目标为任意类型的 map[TypeBase][]TypeBase
//   - TypeBase: string | bool | int | int8 | int16 | int32 | int64 |	uint | uint8 | uint16 | uint32 | uint64 |	float32 | float64 |	time.Time | time.Duration| time.Month | time.Weekday
func GetMapSliceE[K, V values.TypeBase](key string) (map[K][]V, error) {
	val := map[K][]V{}
	if key == "" {
		return val, storage.ErrKeyIsEmpty
	}
	err := GetDefault().Scan(key, &val)
	if err == nil {
		return val, nil
	}
	// Key 不存在或已经过期
	if err == storage.ErrKeyNotExists {
		return val, err
	}
	// Key 存在, 直接解码失败, 尝试类型转换
	anyMap := map[any]any{}
	err = GetDefault().Scan(key, &anyMap)
	if err != nil {
		return val, err
	}
	return values.ToMapSliceE[K, V](anyMap)
}
